#ifndef SYSTEMCALLHANDLER_H
#define SYSTEMCALLHANDLER_H

#include <QObject>
#include <QMap>
#include <QVariant>
#include <memory>

// 前向声明
class CpuSimulator;

/**
 * @brief 系统调用结果结构体
 * 用于返回系统调用的执行结果和状态信息
 */
struct SystemCallResult {
    bool success;           // 执行是否成功
    int errorCode;          // 错误代码（0表示成功）
    QString errorMessage;   // 错误信息
    QMap<QString, int> returnValues; // 返回值映射（寄存器名 -> 值）
    
    SystemCallResult() : success(true), errorCode(0) {}
    SystemCallResult(bool s, int code, const QString& msg) 
        : success(s), errorCode(code), errorMessage(msg) {}
};

/**
 * @brief 系统调用处理器基类
 * 
 * 这是所有系统调用处理器的基类，定义了处理系统调用的通用接口。
 * 每个具体的处理器类都应该继承这个基类并实现handleInterrupt方法。
 */
class SystemCallHandler : public QObject
{
    Q_OBJECT

public:
    explicit SystemCallHandler(QObject *parent = nullptr);
    virtual ~SystemCallHandler() = default;

    /**
     * @brief 处理系统中断调用
     * @param interruptNumber 中断号
     * @param cpu CPU模拟器的引用，用于读取和修改寄存器状态
     * @return SystemCallResult 系统调用执行结果
     */
    virtual SystemCallResult handleInterrupt(int interruptNumber, CpuSimulator* cpu) = 0;

    /**
     * @brief 获取处理器支持的中断号范围
     * @return QPair<int, int> 支持的中断号范围（最小值，最大值）
     */
    virtual QPair<int, int> getSupportedInterruptRange() const = 0;

    /**
     * @brief 获取处理器的描述信息
     * @return QString 处理器描述
     */
    virtual QString getDescription() const = 0;

    /**
     * @brief 重置处理器状态
     * 清理所有运行时状态，如文件句柄、内存分配等
     */
    virtual void reset() = 0;

protected:
    /**
     * @brief 创建成功的系统调用结果
     * @param returnValues 返回值映射
     * @return SystemCallResult 成功结果
     */
    SystemCallResult createSuccessResult(const QMap<QString, int>& returnValues = {});

    /**
     * @brief 创建失败的系统调用结果
     * @param errorCode 错误代码
     * @param errorMessage 错误信息
     * @return SystemCallResult 失败结果
     */
    SystemCallResult createErrorResult(int errorCode, const QString& errorMessage);

    /**
     * @brief 验证中断号是否在支持范围内
     * @param interruptNumber 中断号
     * @return bool 是否支持
     */
    bool isInterruptSupported(int interruptNumber) const;

signals:
    /**
     * @brief 系统调用执行完成信号
     * @param interruptNumber 中断号
     * @param result 执行结果
     */
    void interruptHandled(int interruptNumber, const SystemCallResult& result);

    /**
     * @brief 输出信息信号
     * @param message 输出信息
     */
    void outputMessage(const QString& message);

    /**
     * @brief 错误信息信号
     * @param message 错误信息
     */
    void errorMessage(const QString& message);
};

/**
 * @brief 系统调用处理器工厂类
 * 负责创建各种类型的系统调用处理器实例
 */
class SystemCallHandlerFactory
{
public:
    /**
     * @brief 创建文件系统处理器
     * @param parent 父对象
     * @return std::unique_ptr<SystemCallHandler> 处理器智能指针
     */
    static std::unique_ptr<SystemCallHandler> createFileSystemHandler(QObject* parent = nullptr);

    /**
     * @brief 创建输入输出处理器
     * @param parent 父对象
     * @return std::unique_ptr<SystemCallHandler> 处理器智能指针
     */
    static std::unique_ptr<SystemCallHandler> createInputOutputHandler(QObject* parent = nullptr);

    /**
     * @brief 创建数学运算处理器
     * @param parent 父对象
     * @return std::unique_ptr<SystemCallHandler> 处理器智能指针
     */
    static std::unique_ptr<SystemCallHandler> createMathHandler(QObject* parent = nullptr);

    /**
     * @brief 创建字符串处理器
     * @param parent 父对象
     * @return std::unique_ptr<SystemCallHandler> 处理器智能指针
     */
    static std::unique_ptr<SystemCallHandler> createStringHandler(QObject* parent = nullptr);

    /**
     * @brief 创建系统信息处理器
     * @param parent 父对象
     * @return std::unique_ptr<SystemCallHandler> 处理器智能指针
     */
    static std::unique_ptr<SystemCallHandler> createSystemInfoHandler(QObject* parent = nullptr);
};

#endif // SYSTEMCALLHANDLER_H 